package com.luke.netty.bytebuf;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.util.CharsetUtil;
import java.nio.ByteBuffer;

/**
 * @Descrtption ByteBufTest
 * @Author luke
 * @Date 2020/4/30
 **/
public class ByteBufTest {

    public static void main(String[] args) {

        //ByteBuf 最重要的三个属性 readerIndex、writerIndex、capacity（当前容量大小，可以扩容）
        //将ByteBuffer 分为三段区域
        //0-readerIndex ：已读区域（可丢弃的 discardable bytes）
        //readerIndex - writerIndex ：可读区域
        //writerIndex - capacity ：可写区域（可以超过改值，因为可以自动扩容）
        //readerIndex <= writerIndex

        ByteBuf byteBuf = Unpooled.buffer(10); //可以自动扩容
        //byteBuf = Unpooled.copiedBuffer("你好", CharsetUtil.UTF_8);

        for(int i = 0; i < byteBuf.capacity(); i++){
            byteBuf.writeByte(i);
        }

        //写10个字节
        for(int i = 0; i < byteBuf.capacity(); i++){
            System.out.println(byteBuf.getByte(i)); //getXxx方法不会改变 readerIndex和writerIndex
        }

        System.out.println("-----------------------------");

        //读取5个字节
        for(int i = 0; i < 5; i++){
            System.out.println(byteBuf.readByte()); //readerIndex+1
        }

        //丢弃（释放）已读的空间再写5个字节
        byteBuf.discardReadBytes(); //readerIndex-已读字节数 writerIndex-已读字节数
        System.out.println("capacity:"+byteBuf.capacity());
        for(int i = 0; i < 6; i++){
            byteBuf.writeByte(10+i);//writerIndex+1
            //也可以写超出capacity容量大小的内容，此时capacity最自动增大（即自动扩容）
        }

        byteBuf.capacity(11);//因为扩容后，capacity的值增加到一个未知的值，可以指定扩容的具体值
        System.out.println("capacity:"+byteBuf.capacity());
        //读取10个字节
        for(int i = 0; i < byteBuf.capacity(); i++){
            System.out.println(byteBuf.readByte());
        }

        System.out.println("-------------再读取一遍----------------");
        //可以手动修改下面这三个值
        //byteBuf.readerIndex(1);
        //byteBuf.writerIndex(1);
        //byteBuf.capacity(11);

        //再读取一遍（可以重复读取还没有丢弃过的数据）
        byteBuf.readerIndex(0);
        for(int i = 0; i < byteBuf.capacity(); i++){
            System.out.println(byteBuf.readByte());
        }

    }

}
